package threadsWdh;

class Hola extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("Hola: " + i);
		}
	}
}

class Chao extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("Chao: " + i);
		}
	}
}

class Saludo implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("Hola: " + i);
			Thread.yield();
			// try{
			// Thread.sleep(5000);
			// }catch(InterruptedException ie){
			// System.out.println("Se interrumpe:..."+ie);
			// }
		}

	}

}

class Despedida implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("Chao: " + i);
			Thread.yield();
			// try{
			// Thread.sleep(3000);
			// }catch(InterruptedException ie){
			// System.out.println("Se interrumpe:..."+ie);
			// }
		}
	}

}

class Habla extends Thread {
	String mensaje;
	Historial historial;

	public Habla(String msg, Historial h) {
		mensaje = msg;
		historial = h;
	}

	public void run() {
		for (int i = 1; i < 10; i++) {
			historial.agregar(mensaje);
//			System.out.println(mensaje + " " + i);
//			try {
//				sleep(3000);
//			} catch (InterruptedException ie) {
//				System.out.println(" " + ie);
//			}
			 yield();
		}
	}
}

class Historial {
	String[] mensajes = new String[1000];
	int pos = 0;

	public void agregar(String msg) {
		mensajes[pos] = msg;
		pos++;
	}
}

class NameRunnable implements Runnable {
    public void run() {
        System.out.println("NameRunnable running");
        System.out.println("Run by "
            + Thread.currentThread().getName());
 
//        Runnable r = new Runnable();
//        r.run(); // Legal, pero no inicia un nuevo hilo
    }
}


public class TestThreads {

	public static void main(String[] args) {

		/*
		 * Creacion de threads extendiendo la clase java.lang.Thread
		 * 
		 * Primera Forma
		 */

		// Hola h = new Hola();
		// Chao c = new Chao();
		// h.start();
		// c.start();
		// System.out.println("Fin del Programa...");

		/* Segunda Forma */
		// new Chao().start();
		// new Hola().start();
		// System.out.println("Fin del Programa...");

		// ****************************************************

		/*
		 * Creacion de threads implemntando la interfaz java.lang.Runnable
		 * 
		 * Primera forma
		 */

		// Thread h = new Thread( new Saludo() );
		// Thread c = new Thread( new Despedida() );
		// h.start();
		// c.start();
		// System.out.println("Fin del Programa...");

		/* Segunda Forma */

		// new Thread(new Saludo()).start();
		// new Thread(new Despedida()).start();
		// System.out.println("Fin del Programa...");

		/* Del Ejercicio */
//		 Historial historial = new Historial();
//		 Habla h = new Habla( "Hola", historial );
//		 Habla c = new Habla( "Caho", historial );
//		 h.start();
//		 c.start();

//		Nombre del Hilo de la clase NameRunnable
		 NameRunnable nr = new NameRunnable();
	     Thread t = new Thread(nr);
//	     t.setName("Fred");
	     t.start();
	     
	     // Nombre del Hilo del codigo principal 
	     System.out.println("Threads ist:  " + Thread.currentThread().getName() );
	     
		

	}

}
